﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExpressionEngine
{
    /// <summary>
    /// 二元逻辑操作符处理器（>,<,>=,<=）
    /// </summary>
    public class LogicOperatorHandler : OperatorHandler
    {
        public override Variable operate(OperationSymbol oper)
        {
            if (!validate(oper))
                throw new Exception("小于或等于操作符参数错误");

            DataType varDataType = ValidateVarDataType(oper.Operands);
            Variable res = new Variable();

            switch (varDataType)
            {
                case DataType.FLOAT:
                case DataType.DOUBLE:
                case DataType.INT:
                case DataType.BOOL:
                    {
                        bool intValue = oper.Identifier.Equals(">") ? (double.Parse(oper.Operands.Last().Value.ToString()) > double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                            : oper.Identifier.Equals("<") ? (double.Parse(oper.Operands.Last().Value.ToString()) < double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                           : oper.Identifier.Equals(">=") ? (double.Parse(oper.Operands.Last().Value.ToString()) >= double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                           : oper.Identifier.Equals("<=") ? (double.Parse(oper.Operands.Last().Value.ToString()) <= double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                           : oper.Identifier.Equals("==") ? (double.Parse(oper.Operands.Last().Value.ToString()) == double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                           :oper.Identifier.Equals("!=") ? (double.Parse(oper.Operands.Last().Value.ToString()) != double.Parse(oper.Operands.First().Value.ToString()) ? true : false)
                           :false;
                        res.ValueType = DataType.BOOL;
                        res.Value = intValue;
                    }
                    break;
                case DataType.STRING:
                    {
                        bool iValue = oper.Identifier.Equals("==") ? (oper.Operands.Last().Value.Equals(oper.Operands.First().Value)? true : false)
                            : oper.Identifier.Equals("!=") ? (oper.Operands.Last().Value.Equals(oper.Operands.First().Value)?false: true) 
                            :false;
                        res.ValueType = DataType.BOOL;
                        res.Value = iValue;
                    }
                    break;
                default:
                    throw new Exception("出现非法数据类型");
            }

            return base.ForName(res); 
        }
    }
}
